package com.zeus.common.utils;

import com.google.common.cache.Cache;
import com.google.common.cache.CacheBuilder;
import com.zeus.common.log.ZeusLoggerConfig;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import java.util.List;
import java.util.concurrent.Callable;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.atomic.AtomicInteger;

/**
 * 缓存工具
 * 
 * @author wangfeixiong126@gmail.com  2021/6/27 12:36 上午
 */
public class CacheUtils {
    private final static Logger logger = LoggerFactory.getLogger(CacheUtils.class);

    /**
     * 缓存最大数目
     */
    private static final int DEFAULT_MAX_SIZE = 1000;

    /**
     * 缓存项在10分钟内没有被写访问，则回收
     */
    private static final int DEFAULT_EXPIRE_TIME_MINUTES = 10;

    /**
     * 缓存
     */
    private static final Cache<String, Object> CACHE;

    // 初始化缓存配置
    static {
        CACHE = CacheBuilder.newBuilder().maximumSize(DEFAULT_MAX_SIZE)
            .expireAfterWrite(DEFAULT_EXPIRE_TIME_MINUTES, TimeUnit.MINUTES).build();
    }

    /**
     * 获取缓存内容
     * 
     * @param key key
     * @return 缓存内容
     * @author wangfeixiong126@gmail.com  2021/6/27 12:42 上午
     */
    public static Object get(String key) {
        try {
            if (key != null && !key.isEmpty()) {
                return CACHE.getIfPresent(key);
            }
        } catch (Exception e) {
            if (logger.isWarnEnabled() && ZeusLoggerConfig.needEnableLogger()) {
                logger.warn("### Zeus报警服务, 获取缓存内容出现异常 >> errMsg = {}", e.getMessage());
            }
        }
        return null;
    }

    /**
     * 获取缓存内容，如果不存在则返回默认
     * 
     * @param key           key
     * @param defaultValue  默认
     * @return 缓存内容
     * @author wangfeixiong126@gmail.com  2021/6/27 12:52 上午
     */
    public static Object get(String key, String defaultValue) {
        Object value = null;
        try {
            if (key != null && !key.isEmpty()) {
                value = CACHE.getIfPresent(key);
                value = value != null ? value : defaultValue;
            }
        } catch (Exception e) {
            if (logger.isWarnEnabled() && ZeusLoggerConfig.needEnableLogger()) {
                logger.warn("### Zeus报警服务, 获取缓存内容出现异常 >> errMsg = {}", e.getMessage());
            }
        }
        return value;
    }

    /**
     * 获取缓存内容，如果不存在则执行回调方法
     *
     * @param key       key
     * @param callable  回调方法
     * @return 缓存内容
     * @author wangfeixiong126@gmail.com  2021/6/27 12:52 上午
     */
    public static Object get(String key, Callable<Object> callable) {
        try {
            if (key != null && !key.isEmpty() && callable != null) {
                return CACHE.get(key, callable);
            }
        } catch (Exception e) {
            if (logger.isWarnEnabled() && ZeusLoggerConfig.needEnableLogger()) {
                logger.warn("### Zeus报警服务, 获取缓存内容出现异常 >> errMsg = {}", e.getMessage());
            }
        }
        return null;
    }

    /**
     * 存储缓存
     * 
     * @param key   key
     * @param value 内容
     * @author wangfeixiong126@gmail.com  2021/6/27 12:55 上午
     */
    public static void put(String key, Object value) {
        try {
            if (key != null && !key.isEmpty() && value != null) {
                CACHE.put(key, value);
            }
        } catch (Exception e) {
            if (logger.isWarnEnabled() && ZeusLoggerConfig.needEnableLogger()) {
                logger.warn("### Zeus报警服务, 存储缓存出现异常 >> errMsg = {}", e.getMessage());
            }
        }
    }

    /**
     * 移除缓存
     * 
     * @param key key
     * @author wangfeixiong126@gmail.com  2021/6/27 12:58 上午
     */
    public static void remove(String key) {
        try {
            if (key != null && !key.isEmpty()) {
                CACHE.invalidate(key);
            }
        } catch (Exception e) {
            if (logger.isWarnEnabled() && ZeusLoggerConfig.needEnableLogger()) {
                logger.warn("### Zeus报警服务, 移除缓存出现异常 >> errMsg = {}", e.getMessage());
            }
        }
    }

    /**
     * 批量移除缓存
     *
     * @param keyList key列表
     * @author wangfeixiong126@gmail.com  2021/6/27 12:58 上午
     */
    public static void remove(List<String> keyList) {
        try {
            if (keyList != null && !keyList.isEmpty()) {
                CACHE.invalidateAll(keyList);
            }
        } catch (Exception e) {
            if (logger.isWarnEnabled() && ZeusLoggerConfig.needEnableLogger()) {
                logger.warn("### Zeus报警服务, 批量移除缓存出现异常 >> errMsg = {}", e.getMessage());
            }
        }
    }

    /**
     * 清空缓存
     *
     * @author wangfeixiong126@gmail.com  2021/6/27 12:58 上午
     */
    public static void removeAll() {
        try {
            CACHE.invalidateAll();
        } catch (Exception e) {
            if (logger.isWarnEnabled() && ZeusLoggerConfig.needEnableLogger()) {
                logger.warn("### Zeus报警服务, 清空缓存出现异常 >> errMsg = {}", e.getMessage());
            }
        }
    }

    /**
     * 自增1
     *
     * @param key key
     * @return 获取key的值
     * @author wangfeixiong126@gmail.com  2021/8/4 16:36
     */
    public static int incr(String key) {
        if (key != null && !key.isEmpty()) {
            try {
                AtomicInteger atomicInteger = (AtomicInteger)CACHE.get(key, AtomicInteger::new);
                return atomicInteger.incrementAndGet();
            } catch (Exception e) {
                if (logger.isWarnEnabled() && ZeusLoggerConfig.needEnableLogger()) {
                    logger.warn("### Zeus报警服务, 自增1出现异常 >> errMsg = {}", e.getMessage());
                }
            }
        }
        return 0;
    }

}
